import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;

import org.junit.Test;


/**
 * Java8内置的四大核心函数式接口
 * Consumer<T>:消费型接口  有去无回 无返回值
 * void accept(T t)
 * 
 * Supplier<T>:供给型接口  生成一些对象
 *  T get()
 *  
 * Funciton<T,R>:函数型接口  传入参数 带返回类型  可用于传入字符串处理后再把结果返回
 *   R apply(T t)
 *   
 * Predicate<T>:断言型接口 判断
 * boolean test(T t)
 * 
 * 
 * 
 * 除了这几个常用的函数接口还有扩展的
 * BiFunction ：R apply(T t, U u);接受两个参数，返回一个值，代表一个二元函数；
DoubleFunction ：R apply(double value);只处理double类型的一元函数；
IntFunction ：R apply(int value);只处理int参数的一元函数；
LongFunction ：R apply(long value);只处理long参数的一元函数；
ToDoubleFunction：double applyAsDouble(T value);返回double的一元函数；
ToDoubleBiFunction：double applyAsDouble(T t, U u);返回double的二元函数；
ToIntFunction：int applyAsInt(T value);返回int的一元函数；
ToIntBiFunction：int applyAsInt(T t, U u);返回int的二元函数；
ToLongFunction：long applyAsLong(T value);返回long的一元函数；
ToLongBiFunction：long applyAsLong(T t, U u);返回long的二元函数；
DoubleToIntFunction：int applyAsInt(double value);接受double返回int的一元函数；
DoubleToLongFunction：long applyAsLong(double value);接受double返回long的一元函数；
IntToDoubleFunction：double applyAsDouble(int value);接受int返回double的一元函数；
IntToLongFunction：long applyAsLong(int value);接受int返回long的一元函数；
LongToDoubleFunction：double applyAsDouble(long value);接受long返回double的一元函数；
LongToIntFunction：int applyAsInt(long value);接受long返回int的一元函数；
 * 
 * 
 * 
 * 
 * 
 * 
 * @author Administrator
 *
 */
public class TestLambda4 {
	//Predicate<T>断言型接口:
	@Test
	public void test4() {
		List<String>list=Arrays.asList("Hello","atguigu","Lambda","www");
		List<String>strList=filterStr(list,(x)->x.length()>3);
		strList.forEach((x)->System.out.print(x));
		
	}
	
	
	//将满足条件的字符串，放入到集合中
	public List<String>filterStr(List<String>list,Predicate<String>pre){
		List<String>strList=new ArrayList();
	    for(String str:list) {
	    	if(pre.test(str)) {
	    		strList.add(str);
	    	}
	    }
	    return strList;
	}
	
	
	
	
	
	
	@Test
	public void test3() {
		String newStr=strHandler("\t\t\t我大硅谷威武",(str)->str.trim());
		System.out.print(newStr);
		
		
		String newStr1=strHandler("我大硅谷威武",(str)->str.substring(0,1));
		System.out.print(newStr1);

	}
	//需求：用于处理字符串
	public String strHandler(String str,Function<String,String>fun) {
		return fun.apply(str);
		
	}
	
	//Supplier<T>供给型接口，产生一些对象
	@Test
	public void test2() {
		List<Integer>numList=getNumList(10,()->(int)(Math.random()*100));
		numList.forEach(System.out::println);
		
	}
	//需求：产生指定个数的整数，并放入集合中
	public List<Integer>getNumList(int num,Supplier<Integer>sup){
		List<Integer>list=new ArrayList<>();
		for(int i=0;i<num;i++) {
			Integer n=sup.get();
			list.add(n);
		}
		return list;
	}
	
	
	
	
	
	
	//Consumer<T>消费型接口：
	@Test
	public void test1() {
		happy(10000,(m)->System.out.println("你刚哥喜欢大保健每次消费"+m+"元"));
		
	}
	public void happy(double money,Consumer<Double>con) {
		con.accept(money);
	}

}
